package org.algorithm.熊猫.数组.二月;

import org.junit.Assert;
import org.junit.Test;

import java.util.HashMap;

/**
 * @author 熊猫
 * @date 2022-03-01 星期二18:10
 *
 * uri: https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/
 *
 * 在一个数组 nums 中除一个数字只出现一次之外，其他数字都出现了三次。请找出那个只出现一次的数字。
 *  [3,4,3,3]    4只出现了一次，  所以打印结果是： 4
 *   [9,1,7,9,7,9,7]       1只出现了一次， 所以打印结果是： 1
 *
 */
public class 数组中数字出现的次数 {


    @Test
    public void test(){
        int i =0;
        i|=100;
        System.out.println(i);
        Assert.assertEquals(4, singleNumber2(new int[]{3, 4, 3, 3}));
    }

    public static int singleNumber1(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        for (Integer integer : map.keySet()) {
            if (map.get(integer) == 1) {
                return integer;
            }
        }
        return 0;
    }

    public static int singleNumber2(int[] nums) {
        if(nums==null||nums.length==0) return 0;
        int result = 0;
        for(int i = 0;i<32;i++){
            //统计该位1的出现次数情况
            int count = 0;
            int index = 1<<i;
            for(int j:nums){
                //该位与操作后的结果不为0，则表示该位为1的情况出现了
                if((index&j)!=0){
                    count++;
                }
            }
            //该位上出现1的次数mod3后为1，表示出现一次的数字该位为1
            if(count%3==1){
                result|=index;
            }
        }
        return result;
    }
}
